package net

import "sync"

// 请求
type ReqBody struct {
	Seq   int64       `json:"seq"`
	Name  string      `json:"name"` // 表示服务的名称
	Msg   interface{} `json:"msg"`
	Proxy string      `json:"proxy"`
}

// 返回
type RspBody struct {
	Seq  int64       `json:"seq"`  // 消息序列号
	Name string      `json:"name"` // 消息/路由名称
	Code int         `json:"code"` // 返回码
	Msg  interface{} `json:"msg"`  // 消息内容
}

type WsMsgReq struct {
	Body    *ReqBody
	Conn    WSConn
	Context *WsContext
}

// 线程安全的 连接操作
type WsContext struct {
	mutex    sync.RWMutex
	property map[string]interface{}
}

func (ws *WsContext) Set(key string, value interface{}) {
	ws.mutex.Lock()
	defer ws.mutex.Unlock()
	ws.property[key] = value
}

func (ws *WsContext) Get(key string) interface{} {
	ws.mutex.RLock()
	defer ws.mutex.RUnlock()
	value, ok := ws.property[key]
	if ok {
		return value
	}
	return nil
}

type WsMsgRsp struct {
	Body *RspBody
}

// 是对应于连接的相关缓存数据  可以理解成一些缓存数据(在顶号下线时被清除)
type WSConn interface {
	SetProperty(key string, value interface{})
	GetProperty(key string) (interface{}, error)
	RemoveProperty(key string)
	Addr() string
	Push(name string, data interface{})
}

type Handshake struct {
	Key string `json:"key"`
}

// 心跳
type Heartbeat struct {
	CTime int64 `json:"ctime"`
	STime int64 `json:"stime"`
}
